// 模型
// Models 是从 Schema 编译来的构造函数（规则，首字母大写，用new操作符进行调用）。 它们的实例（new操作符生成的是实例）就代表着可以从数据库保存和读取的 documents。 从数据库创建和读取 document 的所有操作都是通过 model 进行的。
 
// 看 http://www.mongoosejs.net/docs/models.html  官方文档(很详细)
// 引入mongoose
var mongoose  = require('mongoose')

// 让用户名等唯一,mongoose设置useCreateIndex属性为true
mongoose.set('useCreateIndex',true)


// schema指一系列模式，模式中包含了schema对象，可以是表(table)、列(column)、数据类型(data type)、视图(view)、存储过程(stored procedures)、关系(relationships)、主键(primary key)、外键(foreign key)等
// https://blog.csdn.net/u010429286/article/details/79022484
var UserSchema = new mongoose.Schema({
	// type类型，required：true不能为空，index：{unique：true}是否为唯一值，不能重复，username，email不能重复
	// 第一次创建4个username password email date
	username : { type : String , required : true , index : { unique : true } },
	password : { type : String , required : true },
	email : { type : String , required : true , index : { unique : true } },
	date : { type : Date , default : Date.now() },
	// 添加管理员权限isAdmin
	isAdmin: { type : Boolean , default: false},
	// 第一步:添加冻结属性isFreeze
	isFreeze: { type : Boolean , default: false}

})

// 构造 documents，Documents 是 model 的实例。 创建它们并保存到数据库非常简单
var UserModel = mongoose.model('user' , UserSchema);
// 让createIndex生效,上面属性是userCreateIndex,这里是createIndexes，复数形式
UserModel.createIndexes()

// save方法（储存在数据库）
var save = (data) => {	//接收数据
	// new操作符调用构造函数，赋值给user,user是实例
	var user = new UserModel(data)

	// 执行保存方法，返回true或者false
	return user.save()
				.then(()=>{
					return true;
		   	})
		   	.catch(()=>{
		   		return false;
		   	});
}


var findLogin = (data) => {
	return UserModel.findOne(data)
}

// 这里注意，传递的参数只能是email和password，不能用data形参
var updatePassword = (email, password) => {
	// 使用mongoose的update方法根据req的邮箱进行密码的重置,成功返回true
	return UserModel.update({email}, {
		$set: {password}
	})
		.then(() => {
			return true
		})
		.catch(() => {
			return false
		})
}

// 第一步：管理员方法：获取用户信息（controllers/admin.js调用该方法）
var usersList = () => {
	// mongoose中find函数能够获取数据库所有的信息
	return UserModel.find()
}

// 第二步：管理员方法：冻结账号操作
// 参数email，和isFreeze(true or false)
var updateFreeze = (email, isFreeze) => {
	// findPassword中也使用了update操作，更新数据，这里改变isFreeze,第一个参数是设置主体，
	return UserModel.update({email},{
		$set : {isFreeze}
	}).then(()=>{
		return true
	}).catch(()=>{
		return false
	})
}

var deleteUser = (email) => {
	// email是对象属性之一,用{}包裹，正常是{email: '1293964560'}
	return UserModel.deleteOne({ email })
}

// 提供对外接口
module.exports = {
	save,
	findLogin,
	updatePassword,
	usersList,
	updateFreeze,
	deleteUser
}